package MyArrayList;

import java.util.ArrayList;
import java.util.Arrays;

public class MyArrayList<T> implements IList<T>{

    //数组成员
    public T[] elem;

    //usedSize记录已有元素个数
    public int usedSize;
    public MyArrayList(){
        //必须指定数组类型再强转为泛型，否则报错
        elem=(T[])new Object[10];
    }

    //判满方法
    private boolean isFull(){
        return usedSize== elem.length;
    }

    //判断添加元素时，pos是否合法的方法
    private void checkPosOfAdd(int pos){
        if(pos<0||pos>usedSize){
            //不合法则抛出异常
            throw new PosilegalException("添加元素pos位置不合法!");
        }
    }

    //判断设定元素时，pos是否合法的方法
    private  void checkPosOfSet(int pos){
        if(pos<0||pos>=usedSize) {
            //不合法则抛出异常
            throw new PosilegalException("设定/获取元素pos位置不合法!");
        }
    }

    //在数组最后新增元素
    public void add(T data){
        if(isFull()){
            //如果判满则调用Arrays的扩容方法
            Arrays.copyOf(elem,2*usedSize);
        }
        elem[usedSize]=data;
        usedSize++;
    }

    //上一个功能的重载：在指定位置新增元素
    public void add(int pos,T data){
        //利用try,catch处理异常
        try {
            //判断pos是否合法
            checkPosOfAdd(pos);
        }catch (PosilegalException e){
            e.printStackTrace();
        }
        if(isFull()){
            //如果判满则调用Arrays的扩容方法
            Arrays.copyOf(elem,2*usedSize);
        }
        //从usedSize-1位置到pos位置从左到右移动元素
        for(int i=usedSize;i>=pos;i--){
            elem[i+1]=elem[i];
        }
        //插入元素
        elem[pos]=data;
        usedSize++;
    }

    //删除指定元素
    public void remove (T toRemove){
        //调用indexOf方法判断是否有所删除元素
        int pos=indexOf(toRemove);
        if(pos==-1){
            System.out.println("没有要删除的元素！");
            return;
        }
        //从pos位置到usedSize位置从右到左移动元素
        for(int i=pos;i<usedSize-1;i++){
            elem[i]=elem[i+1];
        }
        usedSize--;
    }

    //查找是否包含某元素
    public boolean contains(T toFind) {
        for (int i = 0; i < usedSize; i++) {
            //调用元素的equals方法
            if (elem[i].equals(toFind)) {
                return true;
            }
        }
        return false;
    }

    //查找某元素并返回下标
    public int indexOf(T toFind){
        for (int i = 0; i < usedSize; i++) {
            //调用元素的equals方法
            if (elem[i].equals(toFind)) {
                return i;
            }
        }
        //找不到则返回-1
        return -1;
    }

    //设定指定下标位置元素
    public void set(int pos,T data){
        try {
            //判断pos是否合法
            checkPosOfAdd(pos);
        }catch (PosilegalException e){
            e.printStackTrace();
        }
        elem[pos]=data;

    }

    //获取指定下标位置元素
    public T get(int pos){
        try {
            //判断pos是否合法
            checkPosOfAdd(pos);
        }catch (PosilegalException e){
            e.printStackTrace();
        }
        return elem[pos];
    }

    //打印整个顺序表
    public void display(){
        for(int i=0;i<usedSize;i++){
            //调用元素的toString方法
            System.out.print(elem[i].toString()+" ");
        }
        System.out.println();
    }


    //清空整个顺序表
    public void clear(){
        for(int i=0;i<usedSize;i++)
        {
            //所有元素引用置空
            elem[i]=null;
        }
        usedSize=0;
    }
}

